home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagg_m.zip / INTERRUP.SWG / 0008_Hooking an interrupt.pas < prev    next >
Pascal/Delphi Source File  |  1993-08-17  |  4KB  |  169 lines

  1. PROGRAM CatchInt;
  2.  
  3. USES
  4.    Crt,Dos,Printer;
  5.  
  6. {This program illustrates how you can modify an
  7.  interrupt service routine to perform special
  8.  services for you.}
  9.  
  10.  VAR
  11.     OldInt,OldExitProc: pointer;
  12.     IntCount: array[0..255] of byte;
  13.  
  14.  PROCEDURE GoOldInt(OldIntVector: pointer);
  15.  INLINE (
  16.     $5B/   {POP BX - Get Segment}
  17.     $58/   {POP AX - Get Offset}
  18.     $89/   {MOV SP,BP}
  19.     $EC/
  20.     $5D/   {POP BP}
  21.     $07/   {POP ES}
  22.     $1F/   {POP DS}
  23.     $5F/   {POP DI}
  24.     $5E/   {POP SI}
  25.     $5A/   {POP DX}
  26.     $59/   {POP CX}
  27.     $87/   {XCHG SP,BP}
  28.     $EC/
  29.     $87/   {XCHG [BP],BX}
  30.     $5E/
  31.     $00/
  32.     $87/   {XCHG [BP+2],AX}
  33.     $46/
  34.     $02/
  35.     $87/   {XCHG SP,BP}
  36.     $EC/
  37.     $CB);  {RETF}
  38.  
  39.  
  40.  {$F+}
  41.  
  42.  PROCEDURE NewExitProc;
  43.  
  44.  VAR I: byte;
  45.  VAR A: char;
  46.  
  47.  FUNCTION Intr21Desc(IntNbr: byte): string;
  48.  
  49.  VAR
  50.     St : string[30];
  51.  
  52.  BEGIN
  53.     CASE IntNbr of
  54.        $25: St := 'Set Interrupt Vector';
  55.        $36: St := 'Get Disk Free Space';
  56.        $3C: St := 'Create File with Handle';
  57.        $3E: St := 'Close FILE';
  58.        $40: St := 'WriteFile or Device';
  59.        $41: St := 'Delete FILE';
  60.        $44: St := 'IOCTL';
  61.        $3D: St := 'Open File with Handle';
  62.        $3F: St := 'Read File or Device';
  63.        $42: St := 'Move File pointer';
  64.     ELSE
  65.         St := 'Unknown DOS Service'
  66.     END;
  67.     Intr21Desc := St;
  68.  END;
  69.  
  70.  
  71.  FUNCTION DecToHex(Deci: byte): string;
  72.  
  73.  CONST
  74.     ConvStr: string[16] = '0123456789ABCDEF';
  75.  BEGIN
  76.     DecToHex := ConvStr[Deci div 16 + 1] +
  77.                 ConvStr[Deci mod 16 + 1]
  78.  END;
  79.  
  80.  
  81.  BEGIN
  82.       ClrScr;
  83.       ExitProc := OldExitProc;
  84.       SetIntVec($21,OldInt);
  85.       WriteLn('Int   #   Description');
  86.       WriteLn(' #  Times');
  87.       WriteLn;
  88.       FOR I:= 0 TO 255 DO
  89.          BEGIN
  90.             IF IntCount[I] <> 0 THEN
  91.                BEGIN
  92.                   Write(DecToHex(I),'H');
  93.                   Write(' ',IntCount[I]:3);
  94.                   GotoXY(11,WhereY);
  95.                   WriteLn(Intr21Desc(I))
  96.                END
  97.          END
  98.  END;
  99.  
  100.  
  101.  PROCEDURE NewInt(AX,BX,CX,DX,SI,
  102.                   DI,SD,ES,BP: Word); INTERRUPT;
  103.  
  104.  VAR AH: byte;
  105.  
  106.  BEGIN
  107.    Sound(1220);Delay(10);NoSound;
  108.    AH := Hi(AX);
  109.    IntCount[AH] := IntCount[AH]+1;
  110.    GoOldInt(OldInt)
  111.  END;
  112.  {$F-}
  113.  
  114. {************ Main Program *****************}
  115.  
  116.  VAR I: byte;
  117.      F: text;
  118.      TestStr: string[40];
  119.  
  120.  BEGIN
  121.  
  122.    ClrScr;
  123.  
  124. {Install new Exit PROCEDURE}
  125.  
  126.    OldExitProc := ExitProc;
  127.    ExitProc := @NewExitProc;
  128.  
  129. {Install new Interrupt Vector}
  130.  
  131.    GetIntVec($21, OldInt);
  132.    SetIntVec($21, @NewInt);
  133.  
  134. {********  Testing Section  ***********}
  135.  
  136.    WriteLn('Starting Testing');Delay(1000);
  137.  
  138.    FillChar(IntCount,SizeOf(IntCount),#0);
  139.  
  140.    FOR I:= 0 TO 255 DO
  141.    WriteLn('Testing 1');    {WriteLn's to screens}
  142.                             {do not use the 21H }
  143.                             {Interrupt                }
  144.  
  145.    Write('TYPE anything TO test keyboard: ');
  146.    ReadLn(TestStr);
  147.  
  148.    Writeln('Disk Size ',
  149.             DiskSize(3));        {Uses Service 36H}
  150.  
  151.  
  152.    Assign (F,'TestFile');
  153.    Rewrite(f);                    {Uses Service 3CH,44H}
  154.  
  155.    FOR I:=0 TO 255 DO
  156.    WriteLn(F,'This is only A test'); {Service 40H}
  157.    WriteLn(F,'This is A test too');
  158.    WriteLn(f,'Last test');
  159.  
  160.    Close(f);                    {Uses Service 3EH,40H}
  161.  
  162.    Assign(F,'TestFile');
  163.    Append(f);            {Uses Service 3DH,3FH,42H,44H}
  164.    Close(F);                    {Uses Service 3EH,40H}
  165.  
  166.    Assign(F,'TestFile');
  167.    Erase(f)                        {Uses Service 41H}
  168.  END.
  169.